package hp.com.util;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class FileUtil {

    public static Map<String,String> fileMap(HttpServletRequest req) throws Exception {
        // 创建一个map集合
        Map<String,String> map = new HashMap<>();
        // 文件上传功能
        // 1.判断是否有文件上传
        boolean flag = ServletFileUpload.isMultipartContent(req);
        // 2.获取img的项目绝对路径（服务器绝对路径）
        String path = req.getServletContext().getRealPath("/imgs/");
        if (flag) {
            // 设置文件类型
            // String[] type= new String[]{".jpg",".png"};

            // 3.创建itemFactory工厂
            DiskFileItemFactory disk = new DiskFileItemFactory();
            // 4.通过工厂创建文件上传对象
            ServletFileUpload FileUpload = new ServletFileUpload(disk);
            // 5.解析request 获取表单数据
            List<FileItem> list = FileUpload.parseRequest(req);
            // 6.遍历list  取到每一个表单数据
            for (FileItem fileItem : list) {
                // 7.判断是表单数据 还是文件上传数据
                //true 是普通表单数据  false是文件上传数据
                if (!fileItem.isFormField()) {
                    // 9.获取文件名
                    String name = fileItem.getName();

                    if (!"".equals(name.trim()) && name != null) {
                        map.put("fileName",name);

                        // 得到文件后缀名
                        int index = name.lastIndexOf(".");
                        String endWith = name.substring(index);

                        // 改变文件名
                        String fileNameNew = UUID.randomUUID().toString() + endWith;
                        // 判断是否图片符合类型
                        /*boolean TypeExists = Arrays.asList(type).contains(endWith);
                        if (!TypeExists) {
                            req.getServletContext().setAttribute("msg","文件类型错误，只允许.jpg,.png格式");
                            // req.setAttribute("msg","文件类型错误，只允许.jpg,.png格式");
                        }*/
                        // 10.创建服务器路径对象
                        File file = new File(path);

                        // 11.判断路径是否存在， 若不存在 则创建文件夹
                        if (!file.exists()) {
                            file.mkdirs();
                        }

                        // 12.创建文件对象
                        File file1 = new File(file,fileNameNew);
                        // 把file1的文件路径存入到map中
                        map.put("filePath",file1.getPath());

                        // 13.若文件不存在 创建新文件
                        if (!file1.exists()) {
                            file1.createNewFile();
                        }

                        // 14.把上传的数据写入到文件中
                        fileItem.write(file1);
                    }
                }else {
                    // byte[] bytes = fileItem.get();
                    // String s = new String(bytes, "utf-8");
                    String value = fileItem.getString("utf-8");
                    String fieName = fileItem.getFieldName();
                    // 把键值对设置到map中去
                    map.put(fieName,value);
                }
            }
        }
        return map;
    }
}
